/**
 * 本质上就是给一个N*N的矩阵，由01构成
 * 整个平面由该矩阵密铺得到
 * 现在有Q个询问，每次问:
 * (A, B) 到 (C, D) 之间的矩形的1的数量
 * 只需求出(0, 0)到(x, y)的答案即可很容易求出最后的答案
 * 首先求出单元矩阵的前缀和
 * 所求区域可以分为4个部分，分别与除数和余数有关，相加即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = unsigned long long;
using pii = pair<int, int>;
using vi = vector<int>;

int N, Q;
vector<string> Board;
vector<vi> S;

int f(char c){return c == 'B' ? 1 : 0;}

void init(){
    S.assign(N, vi(N, 0));
    S[0][0] = f(Board[0][0]);
    for(int i=1;i<N;++i) S[0][i] = S[0][i-1] + f(Board[0][i]), S[i][0] = S[i - 1][0] + f(Board[i][0]);

    for(int i=1;i<N;++i)for(int j=1;j<N;++j){
        S[i][j] = f(Board[i][j]) + S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1];
    }
    return;
}
 
llt proc(int r, int c){
    auto br = (r + 1) / N, bc = (c + 1) / N;
    llt ans = (0LL + br) * bc * S[N - 1][N - 1];
    auto lr = (r + 1) % N, lc = (c + 1) % N;
    if(lr) ans += S[lr - 1][N - 1] * (bc + 0LL);
    if(lc) ans += S[N - 1][lc - 1] * (br + 0LL);
    if(lr and lc) ans += S[lr - 1][lc - 1];
    return ans;
}

llt proc(int a, int b, int c, int d){
    auto ans = proc(c, d);
    if(a)ans -= proc(a - 1, d);
    if(b)ans -= proc(c, b - 1);
    if(a and b) ans += proc(a - 1, b - 1);
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    cin >> N >> Q;
    Board.assign(N, "");
    for(auto & s : Board) cin >> s;
    init();

    for(int q=1;q<=Q;++q){
        int a, b, c, d;
        cin >> a >> b >> c >> d;
        cout << proc(a, b, c, d) << endl;
    }
    return 0;
}